# frozen_string_literal: true

# 基本用法（匹配值）
grade = 'B'

case grade
when 'A'
  puts '优秀'
when 'B'
  puts '良好'
when 'C'
  puts '及格'
else
  puts '不及格'
end
# 输出: 良好

# 使用范围匹配
score = 85

case score
when 90..100
  puts 'A'
when 80..89
  puts 'B'
when 70..79
  puts 'C'
else
  puts 'F'
end
# 输出: B

# 使用正则表达式匹配
input = "hello123"

case input
when /^[a-z]+$/
  puts "全是字母"
when /^\d+$/
  puts "全是数字"
when /^[a-z]+\d+$/
  puts "字母开头后跟数字"
else
  puts "其他模式"
end
# 输出: 字母开头后跟数字

#  省略表达式（当作 if-elsif 使用）
age = 25

case
when age < 18
  puts "未成年"
when age >= 18 && age < 65
  puts "成年人"
else
  puts "老年人"
end
# 输出: 成年人

# 多条件匹配
fruit = "apple"

case fruit
when "apple", "pear", "banana"
  puts "这是常见水果"
when "dragonfruit", "kiwi"
  puts "这是进口水果"
else
  puts "未知水果"
end
# 输出: 这是常见水果

# 使用 Proc 或 lambda 匹配
even_check = ->(x) { x.even? }
odd_check = ->(x) { x.odd? }

number = 7

case number
when even_check
  puts "偶数"
when odd_check
  puts "奇数"
end
# 输出: 奇数

# `case` 语句会返回最后执行的表达式的值：
result = case 2
         when 1 then "one"
         when 2 then "two"
         else "many"
         end

puts result  # 输出: two

# while示例
# 计数循环
count = 0
while count < 5
  puts "Count: #{count}"
  count += 1
end

# 输出:
# Count: 0
# Count: 1
# Count: 2
# Count: 3
# Count: 4


# 倒计时
timer = 3
until timer == 0
  puts "倒计时: #{timer}"
  timer -= 1
end
puts "时间到!"

# 输出:
# 倒计时: 3
# 倒计时: 2
# 倒计时: 1
# 时间到!

# 查找第一个能被7整除的数
num = 1
while true
  if num % 7 == 0
    puts "找到第一个能被7整除的数: #{num}"
    break
  end
  num += 1
end

# 输出: 找到第一个能被7整除的数: 7

# 打印1-10的奇数
n = 0
while n < 10
  n += 1
  next if n % 2 == 0
  puts "奇数: #{n}"
end

# 输出:
# 奇数: 1
# 奇数: 3
# 奇数: 5
# 奇数: 7
# 奇数: 9

# 综合示例
# 密码验证系统，最多尝试3次
attempts = 0
correct_password = "ruby123"

while attempts < 3
  print "请输入密码(还剩#{3 - attempts}次机会): "
  input = gets.chomp

  if input != correct_password
    attempts += 1
    next if attempts < 3  # 跳过后续代码，继续循环
    puts "密码错误，账户已锁定!"
    break
  end

  puts "登录成功!"
  break
end

# 可能的输出:
# 请输入密码(还剩3次机会): wrong
# 请输入密码(还剩2次机会): wrong
# 请输入密码(还剩1次机会): ruby123
# 登录成功!